package metier.jdbc.eleve;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JOptionPane;

import metier.Eleve;
import metier.Promotion;
import metier.jdbc.affectation.AffectEleveJdbc;
import metier.jdbc.grade.PromotionJdbc;
import configuration.MessageAppli;


public class EleveJdbc {

	private EleveJdbc(){}
	
	/**
	 * Ajout un eleve en base.
	 * @param Connection connexion à la base
	 * @param Eleve L'eleve a inserer
	 * @return boolean
	 */
	public static boolean ajouter(Connection c, Eleve eleve) {
		// préparer la requete sql 
		// retourne un entier égal à 1 
		//si l’insertion en base de données  a été réalisée
		int res = 0;
		try {
			PreparedStatement ps=c.prepareStatement("INSERT INTO eleve (nomEleve, prenom, dateNaissance, idGrade, idStage, idFonction ) VALUES (?,?,?,?,?,?) ");
			//affecter les values correspondant aux colonnes
			ps.setString(1, eleve.getNomEleve());
			ps.setString(2, eleve.getPrenom());
			ps.setDate(3, new java.sql.Date(eleve.getDateNaissance().getTime()));
			ps.setInt(4, eleve.getIdGrade());
			ps.setInt(5, eleve.getIdStage());
			ps.setInt(6, eleve.getIdFonction());
			res = ps.executeUpdate();
			
			eleve = rechercherEleve(c, eleve);
			
			// Ajout de la promotion lors de la creation
			PromotionJdbc.ajouter(c, new Promotion(eleve.getIdEleve(), eleve.getIdGrade(), new Date()));
			
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return res==1;
	}
	
	/**
	 * Permt de savoir si un eleve existe en base.
	 * @param Connection connexion à la base
	 * @param stage rechercher.
	 * @return retourne vrai si existe.
	 */
	public static boolean eleveExiste(Connection c, Eleve eleve){
		return rechercherListEleve(c, eleve).size() == 1;
	}
	
	/**
	 * Permet de rechercher un eleve.
	 * @param Connection connexion à la base
	 * @param eleve à rechercher
	 * @return stage
	 */
	public static ArrayList<Eleve> rechercherListEleve(Connection c, Eleve eleve) {
		ArrayList<Eleve> lEleveRes = new ArrayList<Eleve>();
		// préparer la requete sql 
		try {
			String requete = "SELECT * FROM eleve " +
					"WHERE nomEleve like '" + eleve.getNomEleve() + "' ";
			if ( eleve.getPrenom() != null ){
				requete += "AND prenom = '" + eleve.getPrenom() + "' ";
			}
			if ( eleve.getIdGrade() != null ){
				requete += "AND idGrade = " + eleve.getIdGrade() + " ";
			}
			if ( eleve.getIdStage() != null ){
				requete += "AND idStage = " + eleve.getIdStage() + " ";
			}
			if ( eleve.getIdFonction() != null ){
				requete += "AND idFonction = " + eleve.getIdFonction() + " ";
			}
			if ( eleve.getDateNaissance() != null ){
				java.sql.Date date = new java.sql.Date(eleve.getDateNaissance().getTime());
				requete += "AND dateNaissance = '" + date + "' ";
			}
			
			PreparedStatement ps=c.prepareStatement(requete);
			ResultSet res = ps.executeQuery(
					);
			while(res.next()){
				lEleveRes.add(new Eleve(res.getInt("idEleve"),
						res.getString("nomEleve"),
						res.getString("prenom"),
						res.getDate("dateNaissance"),
						res.getInt("idGrade"),
						res.getInt("idStage"),
						res.getInt("idFonction")
						));
			}
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return lEleveRes;
	}
	
	/**
	 * Permet de rechercher un eleve.
	 * @param Connection connexion à la base
	 * @param eleve à rechercher
	 * @return stage
	 */
	public static Eleve rechercherEleve(Connection c, Eleve eleve) {
		Eleve lEleveRes = null;
		// préparer la requete sql 
		try {
			String requete = "SELECT * FROM eleve " +
					"WHERE nomEleve like '" + eleve.getNomEleve() + "' ";
			if ( eleve.getPrenom() != null ){
				requete += "AND prenom = '" + eleve.getPrenom() + "' ";
			}
			if ( eleve.getIdGrade() != null ){
				requete += "AND idGrade = " + eleve.getIdGrade() + " ";
			}
			if ( eleve.getIdStage() != null ){
				requete += "AND idStage = " + eleve.getIdStage() + " ";
			}
			if ( eleve.getIdFonction() != null ){
				requete += "AND idFonction = " + eleve.getIdFonction() + " ";
			}
			if ( eleve.getDateNaissance() != null ){
				java.sql.Date date = new java.sql.Date(eleve.getDateNaissance().getTime());
				requete += "AND dateNaissance = '" + date + "' ";
			}
			
			PreparedStatement ps=c.prepareStatement(requete);
			ResultSet res = ps.executeQuery(
					);
			while(res.next()){
				lEleveRes = new Eleve(res.getInt("idEleve"),
						res.getString("nomEleve"),
						res.getString("prenom"),
						res.getDate("dateNaissance"),
						res.getInt("idGrade"),
						res.getInt("idStage"),
						res.getInt("idFonction")
						);
			}
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return lEleveRes;
	}
	
	/**
	 * Permet de rechercher un eleve.
	 * @param Connection connexion à la base
	 * @param eleve à rechercher
	 * @return stage
	 */
	public static Eleve rechercherEleveParId(Connection c, int idEleve) {
		Eleve eleveRes = null;
		// préparer la requete sql 
		try {
			String requete = "SELECT * FROM eleve " +
					"WHERE idEleve = " + idEleve;
			
			PreparedStatement ps=c.prepareStatement(requete);
			ResultSet res = ps.executeQuery(
					);
			while(res.next()){
				eleveRes = new Eleve(res.getInt("idEleve"),
						res.getString("nomEleve"),
						res.getString("prenom"),
						res.getDate("dateNaissance"),
						res.getInt("idGrade"),
						res.getInt("idStage"),
						res.getInt("idFonction")
						);
			}
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return eleveRes;
	}
	
	/**
	 * Permet de rechercher tous les eleves d'un stage.
	 * @param Connection connexion à la base
	 * @param eleve à rechercher
	 * @return stage
	 */
	public static ArrayList<Eleve> getListEleveParStage(Connection c, int idStage) {
		ArrayList<Eleve> listeEleve = new ArrayList<Eleve>();
		// préparer la requete sql 
		try {
			String requete = "SELECT * FROM eleve " +
					"WHERE idStage = " + idStage;
			
			PreparedStatement ps=c.prepareStatement(requete);
			ResultSet res = ps.executeQuery(
					);
			while(res.next()){
				listeEleve.add(new Eleve(res.getInt("idEleve"),
						res.getString("nomEleve"),
						res.getString("prenom"),
						res.getDate("dateNaissance"),
						res.getInt("idGrade"),
						res.getInt("idStage"),
						res.getInt("idFonction")
						));
			}
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return listeEleve;
	}

	/**
	 * Permet de modifier le stage d'un eleve.
	 * @param c
	 * @param eleve
	 * @param stage
	 * @return
	 */
	public static boolean modifierStage(Connection c, Eleve eleve, Eleve stage) {
		try {
			Statement st = c.createStatement();
			Integer i = (stage==null)?null:stage.getIdStage();
			int res = st.executeUpdate("UPDATE eleve SET idStage = " + i + " WHERE idEleve = " + eleve.getIdEleve());
			return res == 1;
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return false;
	}

	/**
	 * Permet de modifier un eleve.
	 * @param c
	 * @param eleve
	 * @return
	 */
	public static boolean modifier(Connection c, Eleve eleve) {
		int res = 0;
		if ( eleve.getIdEleve() != null ){
			try {
				String requete = "UPDATE eleve set " +
						"nomEleve = ?,  " +
						"prenom = ?, " +
						"dateNaissance = ?, " +
						"idGrade = ?," +
						"idStage = ?, " +
						"idFonction = ? " +				
				" WHERE idEleve = " + eleve.getIdEleve();
				PreparedStatement ps=c.prepareStatement(requete);
				//affecter les values correspondant aux colonnes
				ps.setString(1, eleve.getNomEleve());
				ps.setString(2, eleve.getPrenom());
				ps.setDate(3, new java.sql.Date(eleve.getDateNaissance().getTime()));
				ps.setInt(4, eleve.getIdGrade());
				ps.setInt(5, eleve.getIdStage());
				ps.setInt(6, eleve.getIdFonction());
				res = ps.executeUpdate();
				
				// Ajout de la promotion lors de la creation si changement de grade
				Promotion promo = PromotionJdbc.rechercherPromoGrade(c, new Promotion(eleve.getIdEleve(), eleve.getIdGrade(), null));
				if ( promo == null ){
					PromotionJdbc.ajouter(c, new Promotion(eleve.getIdEleve(), eleve.getIdGrade(), new Date()));
				}
				ps.close();
				return res == 1;
			} catch (SQLException e) {
				e.printStackTrace();
				JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
						MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
			}
		}
		return false;
	}
	
	/**
	 * Permet de supprimer un eleve.
	 * @param c
	 * @param eleve
	 * @return
	 */
	public static boolean supprimer(Connection c, Eleve eleve) {
		try {
			
			boolean suppOk = false;
			// Suppression de l'historique des grades
			if ( PromotionJdbc.supprimerHistorique(c, eleve)){
				suppOk = true;
			}else{
				throw new SQLException();
			}
			
			// Suppression de l'historique des affectations.
			if ( AffectEleveJdbc.supprimerHistorique(c, eleve)){
				suppOk = true;
			}else{
				throw new SQLException();
			}
			
			if ( suppOk ){
				PreparedStatement ps=c.prepareStatement("DELETE FROM eleve WHERE idEleve = " + eleve.getIdEleve());
				ps.executeUpdate();
				ps.close();
				return true;
			}
			
			
			return false;
		} catch (SQLException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, MessageAppli.MSG_BDD_ERREUR_REQUETE,
					MessageAppli.MSG_BDD_TITRE_ERREUR, JOptionPane.ERROR_MESSAGE);
		}
		return false;
	}	
}